# 在 Python 中，模块是一个包含 Python 定义和语句的文件。文件名就是模块名，后面加上文件后缀 .py。模块可以定义函数、类和变量，模块里也可以包含可执行的代码。

# 导入模块
# 在 Python 中，你可以使用 import 关键字导入模块。
# 注意，当你导入一个模块，Python 解释器会在导入路径（sys.path）中搜索这个模块。如果找不到，就会引发 ImportError 异常。
import math  # 导入 math 模块

print(math.pi)  # 使用 math 模块中的 pi 变量

# from...import 语句
# 如果只需要用到模块中的某个函数或变量，可以使用 from...import 语句，直接导入这个函数或变量。

from math import pi  # 从 math 模块导入 pi 变量

print(pi)  # 直接使用 pi 变量，无需通过模块名

# 也可以使用 from...import * 语句，导入模块中的所有公有名称。但这种做法通常不被推荐，因为它可能会导致命名冲突。

import math as m  # 导入 math 模块，并给它指定别名 m

print(m.pi)  # 通过别名使用 pi 变量

# 在使用模块和 import 时，有几点需要注意：
# 避免导入不必要的模块。每一个导入的模块都会增加程序的启动时间，占用更多的内存。
# 避免 from...import * 这种导入方式。这种导入方式会导入模块中所有不以下划线开头的名称，可能会导致命名冲突。
# 当使用 as 给模块指定别名时，应确保别名有意义，能够清楚地表示模块的功能或内容。
# 对于标准库中的模块，应优先直接导入模块，而不是导入模块中的函数或变量。这样可以避免命名冲突，也可以让代码更清晰。


# __main__ 是一个特殊的模块名，它指的是当前执行的脚本文件。当你执行一个 Python 文件时，Python 解释器把这个脚本当作主程序来运行，也就是说它是运行环境的一部分。在这个脚本文件中，__name__ 这个特殊的变量就被设置为 "__main__"。
# 这个特性常常被用来在脚本文件中加入这样的代码：
if __name__ == "__main__":
    print("......")

# 这样做的好处是，当你想要将某个.py
# 文件既作为可导入的模块，又可以作为可执行的脚本时，可以用这种方法来区分。也就是说，你可以在文件中定义一些函数和类，然后在
# if __name__ == "__main__": 下面写一些测试这些函数和类的代码。当你直接运行这个文件时，这些测试代码会被执行。但如果你从另一个文件导入这个文件，Python
# 解释器就会跳过这些测试代码。
# 关于你的第二个问题，是的，你的理解是正确的。当你导入一个模块，Python
# 解释器会执行这个模块中的所有顶级代码（也就是不在函数或类中的代码）。这些代码可能会定义一些函数和类，也可能会有一些其他的效果，比如输出一些信息，修改一些全局变量，等等

# 关于模块的声明
# 当你导入一个模块，Python 解释器会执行这个模块中的所有顶级代码（也就是不在函数或类中的代码）。这些代码可能会定义一些函数和类，也可能会有一些其他的效果，比如输出一些信息，修改一些全局变量，等等。然后你就可以在你的代码中使用这个模块中定义的函数和类了。